package org.dxy.api.dto.request.product;

import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
//import org.dxy.domain.model.valobj.Bom;


/**
 * 创建产品请求
 * @author dxy
 * @createTime 2025/8/17
 */
@Data
public class CreateProductRequest {
    
    /**
     * 产品编码
     */
    @NotBlank(message = "产品编码不能为空")
    @Size(max = 50, message = "产品编码长度不能超过50个字符")
    private String productCode;
    
    /**
     * 产品名称
     */
    @NotBlank(message = "产品名称不能为空")
    @Size(max = 100, message = "产品名称长度不能超过100个字符")
    private String productName;

    /**
     * 产品型号: DRX-8000 → 型号（一个系列下可能有多个规格）
      */
    @NotBlank(message = "产品型号不能为空")
    @Size(max = 50, message = "产品型号长度不能超过50个字符")
    private String model;


    /**
     * 产品类别 :
     * 偏 行业/品类 的划分
     * 例子：电子部件/驱动器、机械零件/轴承
     * 用途：管理产品目录、报表统计、采购筛选等
     * 典型场景：工厂有很多产品，但按类别管理更方便
     */
    @NotBlank(message = "产品类别不能为空")
    @Size(max = 50, message = "产品类别长度不能超过50个字符")
    private String category;

    /**
     * 产品类型:
     * 偏 生产阶段/业务流程 的划分
     * 例子：RAW_MATERIAL（原材料）、SEMI_FINISHED（半成品）、FINISHED（成品）
     * 用途：生产/库存管理、工单处理、BOM 展开
     * 比如 BOM 展开、工单生成、产线排产时需要知道是成品还是半成品
     */
    @NotNull(message = "产品类型不能为空")
    private String type;

    /**
     * 产品规格 8x 速率, SATA 接口、16x 速率, USB3.0接口   (对外展示是 DRX-9000-16xUSB3.0  这种 型号 + 规格)
     */
    @NotBlank(message = "产品规格不能为空")
    @Size(max = 200, message = "产品规格长度不能超过200个字符")
    private String specification;
    
    /**
     * 产品版本
     */
    @NotBlank(message = "产品版本不能为空")
    @Size(max = 20, message = "产品版本长度不能超过20个字符")
    private String version;

    /** 计量单位
     * 原材料必须填 unit
     * 半成品/成品 unit 默认 “件”
     * BOM unit 必填
     */
    @NotBlank(message = "计量单位不能为空")
    @Size(max = 20, message = "计量单位长度不能超过20个字符")
    private String unit;

    /**
     * BOM 清单（值对象）
     * - 对于成品（FINISHED）或半成品（SEMI_FINISHED），bom 必须有值，且至少包含一条物料记录。
     * - 对于原材料（RAW_MATERIAL），bom 可以为空。
     */
//    @Valid
//    private Bom bom;

}